package com.ruoyi.system.service.impl;

import java.util.List;
import java.util.stream.Collectors;

import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.exception.base.BaseException;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.uuid.IdUtils;
import com.ruoyi.system.enums.WarehouseState;
import com.ruoyi.system.mapper.InventoryMapper;
import javafx.print.Collation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.ruoyi.system.mapper.StorageLocationMapper;
import com.ruoyi.system.domain.StorageLocation;
import com.ruoyi.system.service.IStorageLocationService;
import org.springframework.transaction.annotation.Transactional;

/**
 * 库位表Service业务层处理
 * 
 * @author ruoyi
 * @date 2023-05-26
 */
@Service
public class StorageLocationServiceImpl implements IStorageLocationService 
{
    @Autowired
    private StorageLocationMapper storageLocationMapper;


    /**
     * 查询库位表
     *
     * @param storageLocationId 库位表主键
     * @return 库位表
     */
    @Override
    public StorageLocation selectStorageLocationByStorageLocationId(String storageLocationId)
    {
        return storageLocationMapper.selectStorageLocationByStorageLocationId(storageLocationId);
    }

    /**
     * 查询库位表列表
     *
     * @param storageLocation 库位表
     * @return 库位表
     */
    @Override
    public List<StorageLocation> selectStorageLocationList(StorageLocation storageLocation)
    {
        return storageLocationMapper.selectStorageLocationList(storageLocation);
    }

    /**
     * 新增库位表
     *
     * @param storageLocation 库位表
     * @return 结果
     */
    @Transactional(rollbackFor = Exception.class)
    @Override
    public int insertStorageLocation(StorageLocation storageLocation)
    {
        storageLocation.setStorageLocationId(IdUtils.simpleUUID());
        return storageLocationMapper.insertStorageLocation(storageLocation);
    }

    /**
     * 修改库位表
     *
     * @param storageLocation 库位表
     * @return 结果
     */
    @Override
    public int updateStorageLocation(StorageLocation storageLocation)
    {
        return storageLocationMapper.updateStorageLocation(storageLocation);
    }

    /**
     * 批量删除库位表
     *
     * @param storageLocationIds 需要删除的库位表主键
     * @return 结果
     */
    @Override
    public int deleteStorageLocationByStorageLocationIds(String[] storageLocationIds)
    {
        return storageLocationMapper.deleteStorageLocationByStorageLocationIds(storageLocationIds);
    }

    /**
     * 删除库位表信息
     *  1.查看当前的状态是否为空闲
     *  3.如果是，把当前库位进行状态的修改，改成失效,不做删除
     * @param storageLocationId 库位表主键
     * @return 结果
     */
    @Override
    public int deleteStorageLocationByStorageLocationId(String storageLocationId)
    {
        StorageLocation storageLocation = storageLocationMapper.selectStorageLocationByStorageLocationId(storageLocationId);
        if(WarehouseState.LEISURE.getCode().equals(storageLocation.getStorageLocationState())){
            storageLocation.setStorageLocationState(WarehouseState.LOSE_EFFICACY.getCode());
            return storageLocationMapper.updateStorageLocation(storageLocation);
        }
        throw new BaseException("不好意思不能删除！");
    }

    /**
     * 通过仓库id对库位进行更新，
     *  1.首先前端在删除的时候，需要掉要接口，所以删除不在这里
     *  2.所以前端给后端的数据只会多不会少
     *  3.所以后端只要把数据库有的更新一下，没有的新增一下就好了
     *
     * @param warehouseId
     * @param storageLocationList
     * @return
     */
    @Transactional(rollbackFor = Exception.class)
    @Override
    public void updateStorageLocationByWarehouseId(String warehouseId, List<StorageLocation> storageLocationList) {
        List<StorageLocation> storageLocations = storageLocationMapper.selectStorageLocationListByWarehouseId(warehouseId);
        if(storageLocations.size()<=0){
            //1.如果当前仓库没有库位，那就直接新增
            for (StorageLocation storageLocation : storageLocationList) {
                storageLocation.setWarehouseId(warehouseId);
                insertStorageLocation(storageLocation);
            }
        }else{
            for (StorageLocation storageLocation : storageLocationList) {
                if(StringUtils.isNull(storageLocation.getStorageLocationId())){
                    storageLocation.setWarehouseId(warehouseId);
                    insertStorageLocation(storageLocation);
                }else{
                    updateStorageLocation(storageLocation);
                }
            }
        }
    }


}
